package main

import (
	"context"
	"fmt"
	"time"
)

func demo13() {
	demo13_2()
}

// 使用 context写法
func demo13_2() {
	// 指定时间 后结束
	//ctx, clean := context.WithDeadline(context.Background(), time.Now().Add(time.Second*3))

	// 4秒后结束
	ctx, clean := context.WithTimeout(context.Background(), time.Second*4)

	// 携带参数
	/*
		ctx := context.WithValue(context.Background(), "name", 111)
		ctx, clean := context.WithCancel(ctx)
	*/
	defer clean()
	message := make(chan int)

	go son131(ctx, message)
	for i := 0; i < 5; i++ {
		message <- i
		fmt.Println("发送的值：", i)
	}
}

func son131(ctx context.Context, msg chan int) {
	t := time.Tick(time.Second)
	// go 每秒执行一次
	for _ = range t {
		select {
		case m := <-msg:
			fmt.Println("接收到的值：", m)
		case <-ctx.Done():
			// ctx.Value("name")
			fmt.Println("结束了 flag")
			return
		}
	}
}

// 使用 常规写法实现
func demo13_1() {
	flag := make(chan bool)
	message := make(chan int)

	go son13(flag, message)
	for i := 0; i < 10; i++ {
		message <- i
		fmt.Println("发送的值：", i)
	}
	fmt.Println("222222222222")
	flag <- true
	//time.Sleep(time.Second)
	fmt.Println("主程序结束")

	/*
		go 每秒循环1次
		t := time.Tick(time.Second)
		for _ = range t {
			fmt.Println("son13")
		}
	*/
}

func son13(flag chan bool, msg chan int) {
	t := time.Tick(time.Second)
	// go 每秒执行一次
	for _ = range t {
		select {
		case m := <-msg:
			fmt.Println("接收到的值：", m)
		case <-flag:
			fmt.Println("结束了 flag")
			return
		}
	}
}
